package com.zeta.system.controller;

import cn.hutool.core.bean.BeanUtil;
import cn.idev.excel.read.listener.ReadListener;
import com.zeta.system.model.entity.SysDict;
import com.zeta.system.model.param.SysDictSaveDTO;
import com.zeta.system.model.param.SysDictUpdateDTO;
import com.zeta.system.model.poi.SysDictExportVO;
import com.zeta.system.model.poi.SysDictImportVO;
import com.zeta.system.model.query.SysDictQueryDTO;
import com.zeta.system.poi.listener.SysDictImportListener;
import com.zeta.system.service.ISysDictService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.zetaframework.annotation.satoken.PreAuth;
import org.zetaframework.base.param.ExistParam;
import org.zetaframework.base.result.ApiResult;
import org.zetaframework.controller.SuperController;
import org.zetaframework.controller.extra.PoiController;

import java.util.Collections;
import java.util.List;

/**
 * 字典 前端控制器
 *
 * @author AutoGenerator
 */
@RequiredArgsConstructor
@Tag(name = "字典", description = "50.字典")
@PreAuth(replace = "sys:dict")
@RestController
@RequestMapping("/system/dict")
public class SysDictController extends SuperController<ISysDictService, Long, SysDict, SysDictQueryDTO, SysDictSaveDTO, SysDictUpdateDTO>
    implements PoiController<SysDictImportVO, SysDictExportVO, SysDict, SysDictQueryDTO>
{

    /**
     * 自定义新增
     *
     * @param saveDTO SysDictSaveDTO 保存对象
     * @return ApiResult<Boolean>
     */
    @Override
    public ApiResult<Boolean> handlerSave(SysDictSaveDTO saveDTO) {
        // 判断是否存在
        if (new ExistParam<SysDict, Long>(SysDict::getCode, saveDTO.getCode()).isExist(service)) {
            return fail("编码已存在");
        }
        return super.handlerSave(saveDTO);
    }

    /**
     * 自定义修改
     *
     * @param updateDTO UpdateDTO 修改对象
     * @return ApiResult<Boolean>
     */
    @Override
    public ApiResult<Boolean> handlerUpdate(SysDictUpdateDTO updateDTO) {
        // 判断是否存在
        if (new ExistParam<SysDict, Long>(SysDict::getCode, updateDTO.getCode(), updateDTO.getId()).isExist(service)) {
            return fail("编码已存在");
        }
        return super.handlerUpdate(updateDTO);
    }

    /**
     * <p>注册导入数据监听器</p>
     * <p>
     * 说明：
     * <pre>
     * 1.你需要手动实现导入监听器，来处理导入的数据
     * 2.不要将Listener交给Spring管理。
     * </pre>
     * 相关文档：
     * <a href="https://fast-excel.github.io/fastexcel/zh-cn/docs/help/faq#%E5%B9%B6%E5%8F%91%E8%AF%BB%E5%8F%96">为何不能将Listener交给Spring管理？</a>
     */
    @Override
    public ReadListener<SysDictImportVO> getReadListener() {
        return new SysDictImportListener(service);
    }

    /**
     * 获取待导出的数据
     *
     * @param sysDictQueryDTO 查询参数 不可为空
     * @return List<ExportBean>
     */
    @Override
    public List<SysDictExportVO> findExportList(SysDictQueryDTO sysDictQueryDTO) {
        // 条件查询Entity数据
        List<SysDict> list = super.handlerBatchQuery(sysDictQueryDTO);
        if (list.isEmpty()) { return Collections.emptyList(); }

        // List<Entity> -> List<ExportBean>
        return list.stream()
                .map(it -> BeanUtil.toBean(it, SysDictExportVO.class))
                .toList();
    }
}

